/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bs.extensoesSwing;

import com.bs.persistencia.EntityManager;
import com.bs.pesquisaView.PesquisaAbstrata;
import com.bs.util.Mensagens;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Bone
 */
public abstract class AbstractGridController<E> {

    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private List<E> lista;
    private List<PesquisaAbstrata> parametros = new ArrayList<PesquisaAbstrata>();
    private Object classe;
    private EntityManager entityManager;
    private int limiteRegistros = 50;
    private E beanSelecionado;
    private Object idBeanSelecionado;

    public E getBeanSelecionado() {
        return beanSelecionado;
    }

    public void setBeanSelecionado(E bean) {
        E old = this.beanSelecionado;
        this.beanSelecionado = bean;
        changeSupport.firePropertyChange("bean", old, bean);
    }

    public Object getIdBeanSelecionado() {
        return idBeanSelecionado;
    }

    public void setIdBeanSelecionado(Object idBeanSelecionado) {
        Object old = this.idBeanSelecionado;
        this.idBeanSelecionado = idBeanSelecionado;
        changeSupport.firePropertyChange("idBeanSelecionado", old, idBeanSelecionado);
    }

    public int getLimiteRegistros() {
        return limiteRegistros;
    }

    public void setLimiteRegistros(int limiteRegistros) {
        int old = this.limiteRegistros;
        this.limiteRegistros = limiteRegistros;
        changeSupport.firePropertyChange("limiteRegistros", old, limiteRegistros);
    }

    public List<E> getLista() {
        return lista;
    }

    public void setLista(List<E> lista) {
        List old = this.lista;
        this.lista = lista;
        changeSupport.firePropertyChange("lista", old, lista);
    }

    public List<PesquisaAbstrata> getParametros() {
        return parametros;
    }

    public void setParametros(List<PesquisaAbstrata> parametros) {
        List<PesquisaAbstrata> old = this.parametros;
        this.parametros = parametros;
        changeSupport.firePropertyChange("parametros", old, parametros);
    }

    public Object getClasse() {
        return classe;
    }

    public void setClasse(Object classe) {
        Object old = this.classe;
        this.classe = classe;
        changeSupport.firePropertyChange("classe", old, classe);
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        EntityManager old = this.entityManager;
        this.entityManager = entityManager;
        changeSupport.firePropertyChange("entityManager", old, entityManager);
    }

    public void addPropertyChangeListener(PropertyChangeListener l) {
        changeSupport.addPropertyChangeListener(l);
    }

    public void removePropertyChangeListener(PropertyChangeListener l) {
        changeSupport.removePropertyChangeListener(l);
    }

    public void atualizarGrid() {
        Collection l = null;
        if (entityManager.getTransaction().isActive()) {
            entityManager.getTransaction().rollback();
        }
        entityManager.getTransaction().begin();
        if (getParametros().isEmpty()) {
            l = getEntityManager().getCollection(getClasse().getClass(), limiteRegistros);
        } else {
            Criterion crit = null;
            for (PesquisaAbstrata c : getParametros()) {
                if (crit == null) {
                    crit = c.getCriterion();
                } else {
                    if (c.getCriterion() != null) {
                        crit = Restrictions.conjunction().add(crit).add(c.getCriterion());
                    }
                }
            }
            if (crit == null) {
                Mensagens.exibeMensagemInformativa("Não foram informados parametros para a pesquisa.");
                return;
            } else {
                l = getEntityManager().getCollection(getClasse().getClass(), crit, limiteRegistros);
            }
        }
        for (Object d : l) {
            entityManager.refresh(d);
        }
        getLista().clear();
        getLista().addAll(l);
    }
    
    public void adicionarALista(E objeto){
        getLista().add(objeto);
    }

    public abstract void novo();

    public abstract void alterar();
}
